home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 January / execd1200.iso / Shareware / Blocks 3 / setup.exe / Source / PLY.C < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-07  |  8.3 KB  |  308 lines

  1. #include <allegro.h>
  2. #include <jgmod.h>
  3. #include <blocks3.h>
  4.  
  5. void Player2_Input(int p_no)
  6. {
  7.   if (key[KEY_W]) ply[p_no].dir = 1;
  8.   if (key[KEY_S]) ply[p_no].dir = 4;
  9.   if (key[KEY_A]) ply[p_no].dir = 8;
  10.   if (key[KEY_D]) ply[p_no].dir = 2;
  11.  
  12.   if ((key[KEY_W]) && (ply[p_no].dy != -1) && (Player_Collision(p_no, 0, -1)))
  13.   {
  14.    ply[p_no].dy = -1;
  15.    return;
  16.   }
  17.   if ((key[KEY_S]) && (ply[p_no].dy != 1)  && (Player_Collision(p_no, 0, 1)))
  18.   {
  19.    ply[p_no].dy = 1;
  20.    return;
  21.   }
  22.   if ((key[KEY_A]) && (ply[p_no].dx != -1)  && (Player_Collision(p_no, -1, 0)))
  23.   {
  24.    ply[p_no].dx = -1;
  25.    return;
  26.   }
  27.   if ((key[KEY_D]) && (ply[p_no].dx != 1)  && (Player_Collision(p_no, 1, 0)))
  28.   {
  29.    ply[p_no].dx = 1;
  30.    return;
  31.   }
  32. }
  33.  
  34. void Player_Input(int p_no)
  35. {
  36.  if (ply[p_no].dz) return;
  37.  
  38.  if (key[KEY_UP]) ply[p_no].dir = 1;
  39.  if (key[KEY_DOWN]) ply[p_no].dir = 4;
  40.  if (key[KEY_LEFT]) ply[p_no].dir = 8;
  41.  if (key[KEY_RIGHT]) ply[p_no].dir = 2;
  42.  
  43.  if ((key[KEY_UP]) && (ply[p_no].dy != -1) && (Player_Collision(p_no, 0, -1)))
  44.  {
  45.   ply[p_no].dy = -1;
  46.   return;
  47.  }
  48.  if ((key[KEY_DOWN]) && (ply[p_no].dy != 1)  && (Player_Collision(p_no, 0, 1)))
  49.  {
  50.   ply[p_no].dy = 1;
  51.   return;
  52.  }
  53.  if ((key[KEY_LEFT]) && (ply[p_no].dx != -1)  && (Player_Collision(p_no, -1, 0)))
  54.  {
  55.   ply[p_no].dx = -1;
  56.   return;
  57.  }
  58.  if ((key[KEY_RIGHT]) && (ply[p_no].dx != 1)  && (Player_Collision(p_no, 1, 0)))
  59.  {
  60.   ply[p_no].dx = 1;
  61.   return;
  62.  }
  63. }
  64.  
  65. void Player_Draw(int p_no)
  66. {
  67.  if ((ply[p_no].dx) || (ply[p_no].dy)) ply[p_no].frame++;
  68.  if (Player_Frame(ply[p_no].frame) == -1) ply[p_no].frame = 0;
  69.  
  70.  if (ply[p_no].dir == 4) DirtyList(ply[p_no].x, ply[p_no].y, ply[p_no].z, 32, 40, ply_pic[p_no][0 + Player_Frame(ply[p_no].frame)]);
  71.  if (ply[p_no].dir == 1) DirtyList(ply[p_no].x, ply[p_no].y, ply[p_no].z, 32, 40, ply_pic[p_no][3 + Player_Frame(ply[p_no].frame)]);
  72.  if (ply[p_no].dir == 2) DirtyList(ply[p_no].x, ply[p_no].y, ply[p_no].z, 32, 40, ply_pic[p_no][6 + Player_Frame(ply[p_no].frame)]);
  73.  if (ply[p_no].dir == 8) DirtyList(ply[p_no].x, ply[p_no].y, ply[p_no].z, 32, 40, ply_pic[p_no][9 + Player_Frame(ply[p_no].frame)]);
  74.  
  75.  if ((ply[p_no].frame%40 == 0) && ((ply[p_no].dx) || (ply[p_no].dy)))
  76.    Add_Sound(ply[p_no].x/32, SFX_CLICK);
  77.  
  78. }
  79.  
  80. int Player_Frame(int f)
  81. {
  82.  if (f/20 == 0) return 0;
  83.  if (f/20 == 1) return 1;
  84.  if (f/20 == 2) return 0;
  85.  if (f/20 == 3) return 2;
  86.  
  87.  return -1;
  88. }
  89.  
  90. void Player_Fall(int p_no)
  91. {
  92.  if (Check_Can_Fall(ply[p_no].x, ply[p_no].y, ply[p_no].z)) ply[p_no].dz = -1;
  93. }
  94.  
  95. void Player_Move(int p_no)
  96. {
  97.  if (Check_Can_Fall(ply[p_no].x, ply[p_no].y, ply[p_no].z))
  98.  ply[p_no].z +=ply[p_no].dz;
  99.  
  100. /* if (Check_Map_And(ply[p_no].x, ply[p_no].y + ply[p_no].dy, ply[p_no].z, 0))*/
  101.  
  102.  ply[p_no].x += ply[p_no].dx;
  103.  ply[p_no].y += ply[p_no].dy;
  104.  
  105.  if (!Check_Can_Fall(ply[p_no].x, ply[p_no].y, ply[p_no].z)) ply[p_no].dz = 0;
  106.  
  107.  if ((ply[p_no].dx) || (ply[p_no].dy))
  108.  {
  109.   if (ply[p_no].x%32 == 0) ply[p_no].dx = 0;
  110.   if (ply[p_no].y%32 == 0) ply[p_no].dy = 0;
  111.   if ((!ply[p_no].dx) && (!ply[p_no].dy)) Player_Teleport(p_no);
  112.  }
  113. }
  114.  
  115. int Check_Can_Fall(int x, int y, int z)
  116. {
  117.  if (!z) return 0;
  118.  
  119.  if (z > 0)
  120.  {
  121.   if (map[x/32][y/32][0] & FULL) return 0;
  122.   if (map[(x + 31)/32][y/32][0] & FULL) return 0;
  123.   if (map[x/32][(y + 31)/32][0] & FULL) return 0;
  124.   if (map[(x + 31)/32][(y + 31)/32][0] & FULL) return 0;
  125.  
  126.   return 1;
  127.  }
  128. }
  129.  
  130. void Player_Teleport(int p_no)
  131. {
  132.  int c, i, j;
  133.  
  134.  if (!(map[ply[p_no].x/32][ply[p_no].y/32][ply[p_no].z/8] & TELEPORT)) return;
  135.  
  136.  c = map[ply[p_no].x/32][ply[p_no].y/32][ply[p_no].z/8];
  137.  
  138.  i = ply[p_no].x/32;
  139.  j = ply[p_no].y/32;
  140.  
  141.  i++;
  142.  if (i == 20)
  143.  {
  144.   i = 0;
  145.   j++;
  146.   if (j == 15)
  147.   {
  148.    i = 0;
  149.    j = 0;
  150.   }
  151.  }
  152.  
  153.  while ((j < 15) && (map[i][j][0] != c) && (map[i][j][1] != c))
  154.  {
  155.   i++;
  156.   if (i == 20)
  157.   {
  158.    i = 0;
  159.    j++;
  160.   }
  161.  }
  162.  
  163.  if (j == 15)
  164.  {
  165.   i = 0;
  166.   j = 0;
  167.  
  168.   while ((j < ply[p_no].y/32 + 1) && (map[i][j][0] != c) && (map[i][j][1] != c))
  169.   {
  170.    i++;
  171.    if (i == 20)
  172.    {
  173.     i = 0;
  174.     j++;
  175.    }
  176.   }
  177.  
  178.   if (j == ply[p_no].y/32 + 1) exit(12);
  179.  }
  180.  
  181.  DirtyList(ply[p_no].x, ply[p_no].y, ply[p_no].z, 32, 40, blank);
  182.  
  183.  ply[p_no].x = i*32;
  184.  ply[p_no].y = j*32;
  185.  
  186.  if (map[i][j][0] == c) ply[p_no].z = 0;
  187.  else ply[p_no].z = 8;
  188.  
  189. }
  190.  
  191. int Check_Map(int x, int y, int z, int b, int or_and, int equals_and)
  192. {
  193.  if (or_and == 1)   /* AND */
  194.  {
  195.   if (equals_and == 1)  /* && */
  196.   if ((map[x/32][y/32][z/8] & b) &&
  197.       (map[(x + 31)/32][y/32][z/8] & b) &&
  198.       (map[x/32][(y + 31)/32][z/8] & b) &&
  199.       (map[(x + 31)/32][(y + 31)/32][z/8] & b)) return 1;
  200.   else          /* EQUALS */
  201.   if ((map[x/32][y/32][z/8] == b) &&
  202.       (map[(x + 31)/32][y/32][z/8] == b) &&
  203.       (map[x/32][(y + 31)/32][z/8] == b) &&
  204.       (map[(x + 31)/32][(y + 31)/32][z/8] == b)) return 1;
  205.  
  206.   return 0;
  207.  }
  208.  else   /* OR */
  209.  {
  210.   if (equals_and == 1)  /* && */
  211.   if ((map[x/32][y/32][z/8] & b) ||
  212.       (map[(x + 31)/32][y/32][z/8] & b) ||
  213.       (map[x/32][(y + 31)/32][z/8] & b) ||
  214.       (map[(x + 31)/32][(y + 31)/32][z/8] & b)) return 1;
  215.   else          /* EQUALS */
  216.   if ((map[x/32][y/32][z/8] == b) ||
  217.       (map[(x + 31)/32][y/32][z/8] == b) ||
  218.       (map[x/32][(y + 31)/32][z/8] == b) ||
  219.       (map[(x + 31)/32][(y + 31)/32][z/8] == b)) return 1;
  220.  
  221.   return 0;
  222.  }
  223. }
  224.  
  225. void Player_Pickup_Check(int p_no)
  226. {
  227.  if (map[ply[p_no].x/32][ply[p_no].y/32][ply[p_no].z/8] & PICKUP) Player_Pickup(p_no, ply[p_no].x/32, ply[p_no].y/32);
  228.  if (map[(ply[p_no].x + 31)/32][ply[p_no].y/32][ply[p_no].z/8] & PICKUP) Player_Pickup(p_no, (ply[p_no].x + 31)/32, ply[p_no].y/32);
  229.  if (map[ply[p_no].x/32][(ply[p_no].y + 31)/32][ply[p_no].z/8] & PICKUP) Player_Pickup(p_no, ply[p_no].x/32, (ply[p_no].y + 31)/32);
  230.  if (map[(ply[p_no].x + 31)/32][(ply[p_no].y + 31)/32][ply[p_no].z/8] & PICKUP) Player_Pickup(p_no, (ply[p_no].x + 31)/32, (ply[p_no].y + 31)/32);
  231. }
  232.  
  233. void Player_Pickup(int p_no, int x, int y)
  234. {
  235.  map[x][y][ply[p_no].z/8] = 0;
  236.  DirtyList(x*32, y*32, ply[p_no].z/8, 32, 40, blank);
  237.  
  238.  Add_Sound(x, SFX_YEAH);
  239. }
  240.  
  241. int Player_Collision(int p_no, int dx, int dy)
  242. {
  243.  if ((ply[p_no].z != 0) && (Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, 0, MIRROR, 0, 1))) return 0;
  244.  
  245.  if (Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, 0, 1, 1)) return 1;
  246.  if (Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, SOLID, 0, 0)) return 0;
  247.  if (Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, TELEPORT, 0, 1)) return 1;
  248.  
  249.  if ((ply[p_no].x%32 == 0) && (ply[p_no].y%32 == 0))
  250.  if ((dx == 0) || (dy == 0))
  251.  if (map[ply[p_no].x/32 + dx][ply[p_no].y/32 + dy][ply[p_no].z/8] & PUSH)
  252.  if (!(map[ply[p_no].x/32 + dx*2][ply[p_no].y/32 + dy*2][0] & PICKUP))
  253.  if (!Check_Can_Fall(ply[p_no].x, ply[p_no].y, ply[p_no].z))
  254.  {
  255.   if ((map[ply[p_no].x/32 + dx*2][ply[p_no].y/32 + dy*2][ply[p_no].z/8] == 0) ||
  256.       (map[ply[p_no].x/32 + dx*2][ply[p_no].y/32 + dy*2][ply[p_no].z/8] & SWITCH))
  257.   {
  258.    Add_Undo();
  259.  
  260.    map[(ply[p_no].x/32 + dx)][(ply[p_no].y/32 + dy)][ply[p_no].z/8] = 0;
  261.    Box_Push((ply[p_no].x/32 + dx), (ply[p_no].y/32 + dy), ply[p_no].z, dx, dy);
  262.    return 1;
  263.   }
  264.   if (map[ply[p_no].x/32 + dx][ply[p_no].y/32 + dy][ply[p_no].z/8] == BOMB1)
  265.   {
  266.    Add_Undo();
  267.  
  268.    Explode_Prime(ply[p_no].x/32 + dx, ply[p_no].y/32 + dy, ply[p_no].z/8);
  269.   }
  270.  }
  271.  
  272.  if (((Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, PICKUP, 0, 1)) ||
  273.      (Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, SWITCH, 0, 1)) ||
  274.      (Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, FALL, 0, 1))) &&
  275.      (!(Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, PUSH, 0, 1))) &&
  276.      (!(Check_Map(ply[p_no].x + dx, ply[p_no].y + dy, ply[p_no].z, SOLID, 0, 1))))
  277.    return 1;
  278.  
  279.  return 0;
  280. }
  281.  
  282. void Player_Monster_Collision(int p_no)
  283. {
  284.  int i;
  285.  
  286.  for (i = 0; i < mon_count; i++)
  287.  {
  288.   if ((abs(ply[p_no].x - mon[i].x) < 16) &&
  289.       (abs(ply[p_no].y - mon[i].y) < 16))
  290.   {
  291.    game_exit = 1;
  292.   }
  293.  }
  294. }
  295.  
  296. void Player_Laser_Collision(int p_no)
  297. {
  298.  if (map_laser[ply[p_no].x/32][ply[p_no].y/32][ply[p_no].z/8]) game_exit = 1;
  299.  if (map_laser[(ply[p_no].x + 31)/32][ply[p_no].y/32][ply[p_no].z/8]) game_exit = 1;
  300.  if (map_laser[ply[p_no].x/32][(ply[p_no].y + 31)/32][ply[p_no].z/8]) game_exit = 1;
  301.  if (map_laser[(ply[p_no].x + 31)/32][(ply[p_no].y + 31)/32][ply[p_no].z/8]) game_exit = 1;
  302. }
  303.  
  304. void Player_Death(int p_no)
  305. {
  306.  
  307. }
  308.